home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 36 / Amiga Format CD36 (1999-01-22)(Future Publishing)(GB)[!][issue 1999-02].iso / -in_the_mag- / under_the_bonnet / multiscan_fixes / promoteview / promoteview.asm < prev    next >
Assembly Source File  |  1998-12-05  |  4KB  |  213 lines

  1.  
  2. ******************
  3. * PromoteView V2 *
  4. * (C) 7-Jun-96   *
  5. * Martin Gierich *
  6. ******************
  7.  
  8. ;--------------------------------------------------------------
  9.  
  10.     INCDIR    Source:StripInc/
  11.     INCLUDE    exec/exec_lib.i
  12.     INCLUDE    dos/dos_lib.i
  13.     INCLUDE    graphics/graphics_lib.i
  14.     INCLUDE    graphics/view.i
  15.     INCLUDE    graphics/monitor.i
  16.  
  17. CALL    MACRO
  18.     jsr    _LVO\1(a6)
  19.     ENDM
  20.  
  21. pr_CLI        = 172
  22. pr_MsgPort    = 92
  23. pr_CurrentDir    = 152
  24. cli_Module    = 60
  25. sm_NumArgs    = 28
  26. sm_ArgList    = 36
  27.  
  28. ;--------------------------------------------------------------
  29. start:    clr.l    -(sp)
  30.     clr.l    -(sp)
  31.     move.l    4.w,d6
  32.     move.l    d6,a6
  33.     lea    dosname(pc),a1
  34.     moveq    #36,d0            check for OS2.0+
  35.     CALL    OpenLibrary        open dos.library
  36.     move.l    d0,d5            d5=dos-base
  37.     beq    NoDos
  38.     lea    gfxname(pc),a1
  39.     moveq    #36,d0
  40.     CALL    OpenLibrary
  41.     move.l    d0,d7            d7=graphics.library
  42.     beq    NoGfx
  43.  
  44.     move.l    d5,a6            started from CLI
  45.     lea    Template(pc),a0
  46.     move.l    a0,d1
  47.     move.l    sp,d2            a2=arg-array
  48.     moveq    #0,d3
  49.     CALL    ReadArgs        process argumentline
  50.     move.l    d0,d4            d4=RdArgs-struct
  51.     beq    NoRA
  52.     move.l    (sp),d0            SCREENMODE keyword ?
  53.     beq    NoMode
  54.     move.l    d0,a2
  55.  
  56. GetHex    moveq    #0,d0
  57.     moveq    #0,d1
  58. .A    move.b    (a2)+,d1        get hexadecimal number
  59.     cmp.b    #"0",d1
  60.     blo.s    .B
  61.     cmp.b    #"9",d1
  62.     bls.s    .C
  63.     bset    #5,d1
  64.     cmp.b    #"a",d1
  65.     blo.s    .B
  66.     cmp.b    #"f",d1
  67.     bhi.s    .B
  68.     sub.b    #"a"-10-"0",d1
  69. .C    sub.b    #"0",d1
  70.     lsl.l    #4,d0
  71.     or.b    d1,d0
  72.     bra.s    .A
  73. .B    lea    NewMoni(pc),a0
  74.     move.l    d0,(a0)
  75.     beq    NoMon
  76.     and.l    #MONITOR_ID_MASK,d0
  77.     sub.l    a1,a1
  78.     move.l    d7,a6
  79.     CALL    OpenMonitor
  80.     lea    MonSpec(pc),a0
  81.     move.l    d0,(a0)
  82.     beq    NoMon
  83.     move.l    d0,a1
  84.     move.l    ms_LegalView+0(a1),4(a0)
  85.  
  86. GetMoni    move.l    d6,a6
  87.     CALL    Forbid
  88.     move.l    d7,a1        patch MakeVPort
  89.     move.l    #_LVOMakeVPort,d0
  90.     lea    Patch(pc),a0
  91.     exg.l    d0,a0
  92.     CALL    SetFunction
  93.     lea    OldFunc(pc),a0
  94.     move.l    d0,(a0)
  95.     beq.s    NoSet
  96.     CALL    CacheClearU    self modifying code :-)
  97.     CALL    Permit
  98.  
  99. Install    tst.l    4(sp)        INSTALL keyword ?
  100.     beq.s    WaitC
  101.     sub.l    a1,a1
  102.     CALL    FindTask
  103.     move.l    d0,a0
  104.     move.l    pr_CLI(a0),d0
  105.     beq.s    WaitC
  106.     lsl.l    #2,d0
  107.     move.l    d0,a0
  108.     clr.l    cli_Module(a0)    do not free seglist
  109.     bra.s    NoMode
  110.  
  111. WaitC    moveq    #0,d0
  112.     moveq    #0,d1
  113.     bset    #12,d1
  114.     CALL    SetSignal
  115.     moveq    #0,d0
  116.     bset    #12,d0
  117.     CALL    Wait        wait for CTRL-C
  118.  
  119.     CALL    Forbid
  120.     move.l    d7,a1        unpatch MakeVPort
  121.     move.l    #_LVOMakeVPort,a0
  122.     move.l    OldFunc(pc),d0
  123.     CALL    SetFunction
  124.     lea    Patch(pc),a0
  125.     cmp.l    a0,d0
  126.     beq.s    Removed
  127.     move.l    d7,a1        something else has patched it
  128.     move.l    #_LVOMakeVPort,a0
  129.     CALL    SetFunction    reset newer func
  130.     CALL    Permit
  131.     bra.s    WaitC        and wait some more
  132.  
  133. Removed    CALL    CacheClearU
  134.     CALL    Permit
  135. NoSet    move.l    MonSpec(pc),a0    free stuff
  136.     move.l    d7,a6
  137.     CALL    CloseMonitor
  138. NoMon
  139. NoMode    move.l    d5,a6
  140.     move.l    d4,d1
  141.     CALL    FreeArgs    free RdArgs-struct
  142. NoRA    move.l    d7,a1
  143.     move.l    d6,a6
  144.     CALL    CloseLibrary    close gfx
  145. NoGfx    move.l    d5,a1
  146.     move.l    d6,a6
  147.     CALL    CloseLibrary    close dos
  148. NoDos    addq.l    #8,sp
  149.     moveq    #0,d0
  150.     rts
  151.  
  152. ;--------------------------------------------------------------
  153.  
  154. Patch:    movem.l    d0-d1/a0-a4,-(sp)
  155.     move.l    a0,a3            a3=View
  156.     move.l    a1,a2            a2=ViewPort
  157.     CALL    GfxLookUp
  158.     move.l    d0,a4            a4=ViewExtra (found)
  159.     tst.l    d0
  160.     bne.s    VEfnd
  161.     moveq    #VIEW_EXTRA_TYPE,d0
  162.     CALL    GfxNew
  163.     move.l    d0,a4            a4=ViewExtra (created)
  164.     tst.l    d0
  165.     beq.s    NoPtch
  166.     move.l    d0,a1
  167.     move.l    a3,a0
  168.     CALL    GfxAssociate
  169.     bra.s    VEcrt
  170.  
  171. VEfnd    move.l    a2,a1    only patch ColorMap, if ViewExtra was found
  172.     move.l    vp_ColorMap(a2),d0
  173.     beq.s    NoPtch
  174.     move.l    d0,a2
  175.     tst.b    cm_Type(a2)
  176.     beq.s    NoPtch
  177.     move.l    a1,cm_vp(a2)
  178.     move.l    MonSpec(pc),d0
  179.     cmp.l    ve_Monitor(a4),d0    check if right monitor present
  180.     beq.s    NoPtch
  181.     move.l    cm_VPModeID(a2),d0
  182.     and.l    #MONITOR_ID_MASK,d0    check for default monitor
  183.     beq.s    VEcrt
  184.     move.l    NewMoni(pc),d0
  185.     move.l    d0,cm_VPModeID(a2)
  186.     move.w    d0,vp_Modes(a1)
  187.     CALL    FindDisplayInfo
  188.     move.l    d0,cm_NormalDisplayInfo(a2)
  189.     move.l    d0,cm_CoerceDisplayInfo(a2)
  190.  
  191. VEcrt    move.l    a3,ve_View(a4)
  192.     lea    MonSpec(pc),a0
  193.     move.l    (a0),ve_Monitor(a4)
  194.     move.w    4(a0),v_DxOffset(a3)
  195.     move.w    6(a0),v_DyOffset(a3)
  196.     or.w    #V_EXTENDED_MODE,v_Modes(a3)
  197.  
  198. NoPtch    movem.l    (sp)+,d0-d1/a0-a4
  199.     dc.w    $4ef9    jump to old jumpin
  200. OldFunc    dc.l    0
  201.  
  202. NewMoni    dc.l    0    Global variables
  203. MonSpec    dc.l    0
  204. Voffset    dc.w    0,0
  205.  
  206. ;--------------------------------------------------------------
  207.  
  208. dosname        dc.b    "dos.library",0
  209. gfxname        dc.b    "graphics.library",0
  210. Template    dc.b    "SCREENMODE/A,INSTALL/S",0
  211. version        dc.b    "$VER: PromoteView 2.0 (7-Jun-96)",10,0
  212.  
  213.